package cn.funeralobjects.upms.service;

import cn.funeralobjects.common.service.CommonIntCloudCrudService;
import cn.funeralobjects.upms.BasicInfo;
import cn.funeralobjects.upms.entity.ELoginUser;
import cn.funeralobjects.upms.model.LoginUser;

import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * 登录用户业务
 *
 * @author FuneralObjects
 * Create date: 2019-08-14 17:23
 */
public interface LoginUserService extends CommonIntCloudCrudService<LoginUser, ELoginUser> {

    String ENTITY_NAME = "LOGIN_USER";

    /**
     * 将移除某个用户下的登录名
     *
     * @param userId 用户id
     * @param name   登录名
     */
    void deleteByNameFromUser(Integer userId, String name);

    /**
     * 删除所有登陆用户
     *
     * @param userId 用户id
     */
    void deleteAllByUser(Integer userId);

    /**
     * 通过登录名和密码查询用户ID
     *
     * @param name     登录名
     * @param password 密码
     * @return 用户id
     */
    Integer findUserIdByNameAndPassword(String name, String password);

    /**
     * 通过登录名查询登陆信息
     *
     * @param name 登陆名
     * @return 查询结果
     */
    Optional<ELoginUser> findLoginUserByName(String name);

    /**
     * 通过用户id,查询其所有登陆信息
     *
     * @param userId 用户id
     * @return 登陆信息集合
     */
    List<ELoginUser> findAllByUserId(Integer userId);

    /**
     * 禁用登陆账户
     *
     * @param name 登录名
     */
    void disable(String name);

    /**
     * 启用登陆账户
     *
     * @param name 登陆名
     */
    void enable(String name);

    /**
     * 禁用用户的登陆账户
     *
     * @param userId 用户Id
     */
    void disable(Integer userId);

    /**
     * 禁用用户的登陆账户
     *
     * @param userIds 用户id集合
     */
    void disable(List<Integer> userIds);

    /**
     * 启用用户的登陆账户
     *
     * @param userId 用户id
     */
    void enable(Integer userId);

    /**
     * 启用用户的登陆账户
     *
     * @param userIds 用户id集合
     */
    void enable(List<Integer> userIds);

    /**
     * 更新登录名的单个密码
     *
     * @param name     登录名
     * @param password 密码
     */
    void updatePassword(String name, String password);

    /**
     * 更新登陆名和密码（批量）
     *
     * @param namePasswordMap 登陆名-密码 的map集合
     */
    void updatePassword(Map<String, String> namePasswordMap);

    /**
     * 必须存在登录名
     *
     * @param name 登录名
     */
    void mustExistsName(String name);

    /**
     * 获取实体名
     *
     * @return 实体名
     */
    @Override
    default String getName() {
        return ENTITY_NAME;
    }

    /**
     * 获取模块名
     *
     * @return 模块名
     */
    @Override
    default String getModuleName() {
        return BasicInfo.MODULE;
    }
}
